package __数组

/*
https://leetcode.cn/problems/spiral-matrix-ii/

59. 螺旋矩阵 II
给你一个正整数 n ，生成一个包含 1 到 n方 所有元素，且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。

示例 1：
输入：n = 3
输出：[
[1,2,3],
[8,9,4],
[7,6,5]
]

示例 2：
输入：n = 1
输出：[[1]]
*/

func generateMatrix(n int) [][]int {
	startx, starty := 0, 0 //起始位置, 每一圈都会发生变动
	var loop int = n / 2
	var center int = n / 2

	count := 1  //当前数字值  范围: 1~n方
	offset := 1 //每一行遍历边界缩减的值

	res := make([][]int, n) //声明结果二维数组
	for i := 0; i < n; i++ {
		res[i] = make([]int, n)
	}

	for loop > 0 { //圈数
		i, j := startx, starty

		for j = starty; j < n-offset; j++ { //行数不变 列数在变
			res[startx][j] = count
			count++
		}

		for i = startx; i < n-offset; i++ { //列数不变是j 行数变
			res[i][j] = count
			count++
		}

		for ; j > starty; j-- { //行数不变 i 列数变 j--
			res[i][j] = count
			count++
		}

		for ; i > startx; i-- { //列不变 行变
			res[i][j] = count
			count++
		}
		startx++ //起始坐标向内一圈位置 (右下角)
		starty++
		offset++ //需要减去的位移量++(向内一圈)
		loop--   //圈数--
	}

	if n%2 == 1 { //如果目标数字为奇数, 会少遍历一圈, 需要手动给中心点赋值
		res[center][center] = n * n
	}

	return res
}
